/*
 * Copyright (C) 2013～2023 上海颐凡软件科技有限公司
 * Yfann Software Technology (Shanghai) Co.,LTD
 * All Rights Reserved.
 * 公司网址: www.yfann.com
 * 365IT教育网，成就您优秀架构师之梦！
 * 平台网址: www.365itedu.com
 */
package com.yfann.web.base.sys.listener;

import java.io.File;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

import com.yfann.sword.web.fwk.consts.FrameworkConst;
import com.yfann.sword.web.fwk.util.PropertyUtil;
import com.yfann.web.base.entity.dto.TSYS01OutputDto;

/**
 * 系统初始化监听器初始化类。
 * @since V1.0
 * @version 版本1.0 2013.10.20
 * @author 颜廷吉
 */
public class InitServletContextListener implements ServletContextListener {
    /**
     * 日志
     */
    Log log = LogFactory.getLog(InitServletContextListener.class);

    /**
     * 属性文件扩展名
     */
    private static final String PROPERTY_EXTENSION = ".properties";

    /**
     * 读入的属性文件名称列表
     */
    private static Set<String> i18nLanguageNames = new HashSet<String>();

    /**
     * Servlet容器上下文
     */
    private ServletContext context;

    /**
     * Servlet容器初始化。
     * @param sce ServletContextEvent
     */
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        context = sce.getServletContext();

        String contextPath = context.getContextPath();

        // 全局上下文路径
        context.setAttribute(FrameworkConst.APP_CONTEXT_KEY, contextPath);

        // 获得国际化语言属性文件信息
        getI18nLanguageNames();
        context.setAttribute(FrameworkConst.I18N_LANGUAGE_NAMES_KEY, i18nLanguageNames);

        // 设置默认界面风格信息
        context.setAttribute(FrameworkConst.USER_SKIN_KEY, "default");

        // 阻塞功能设定
        String tempPath = InitServletContextListener.class.getResource("/").getPath();
        // linux 对应 需要加上一个 "/"
        tempPath = "/" + tempPath;
        ApplicationContext applicationContext = new FileSystemXmlApplicationContext(tempPath+"/applicationContext.xml");
        InitServletContextSupport initServletService = (InitServletContextSupport) applicationContext.getBean("initServletContextSupport");
        initServletService.executeService();

        // session里设定静态编码信息
        List<TSYS01OutputDto> codeBeanList = initServletService.getCodeBeanList();
        context.setAttribute(FrameworkConst.CODE_BEAN_LIST_KEY, codeBeanList);
    }

    /**
     * 监听器上下文销毁处理时被调用。<br>
     * @param sce 容器事件
     */
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
    }

    /**
     * 取得属性文件列表。<br>
     * @return List<String> 属性文件列表
     */
    private static void getI18nLanguageNames() {
        String resourceURL = InitServletContextListener.class.getResource("/").toString();
        String resourcePath = resourceURL.substring(5, resourceURL.length()) + "i18nProperties/";
        // 新建文件实例
        File f = new File(resourcePath);
        // 此处获取文件夹下的所有文件
        File[] list = f.listFiles();
        for (int i = 0; i < list.length; i++) {
            String fileName = list[i].getName();
            if (PROPERTY_EXTENSION.equals(fileName.substring(fileName.length() - 11, fileName.length()))) {
                String i18nFilelanguage = PropertyUtil.getPropertyI18nLanguageName(fileName);
                if (i18nFilelanguage != null) {
                    i18nLanguageNames.add(i18nFilelanguage);
                }
            }
        }
    }

}
